package com.sprucetec.livechat.service;

import com.alibaba.fastjson.JSONObject;
import com.sprucetec.livechat.common.NettyMessageDto;
import io.netty.channel.ChannelHandlerContext;

/**
 * @ClassName ChatService
 * @Description: 目前以为公司生产环境要求nettySever 必须为集群模式，所以统一采用MQ消息机制实现集群方案
 * @Author Kenny
 * @Date 2020/4/2
 **/
public interface ChatService {

    /**
     * 客户端成功连接
     *
     * @param param
     * @param ctx
     */
    void connected(JSONObject param, ChannelHandlerContext ctx);

    /**
     * 单节点发送群消息
     *
     * @param param
     * @param ctx
     */
    void groupSend(JSONObject param, ChannelHandlerContext ctx);


    /**
     * 发送群消息 MQ方式
     *
     * @param nettyMessageDto
     */
    void groupSendByMq(NettyMessageDto nettyMessageDto);

    /**
     * 单节点移除channel
     *
     * @param ctx
     */
    void remove(ChannelHandlerContext ctx);

    /**
     * 通知各个客户端，用户离开
     * @param ctx
     */
    void removeNotifyByMq(ChannelHandlerContext ctx);

    /**
     * 前端websocket 因为nginx代理ws协议 1分钟失效机制，前端使用心跳包机制： 前台 ping -> nettyServer pong -> 前台
     *
     * @param param
     * @param ctx
     */
    void ping(JSONObject param, ChannelHandlerContext ctx);

    /**
     * 不存在当前类型的websocket类型
     *
     * @param ctx
     */
    void typeError(ChannelHandlerContext ctx);

    /**
     * 单节点方式关闭直播
     *
     * @param param
     * @param ctx
     */
    void liveServerSend(JSONObject param, ChannelHandlerContext ctx);

    /**
     * 直播平台后端 通过mq 发消息关闭推送方式关闭直播
     * messageDto
     */
    void liveServerSendByMq(NettyMessageDto messageDto);


    /**
     * MQ 集群方式 清空当前视频的所有缓存数据（在线用户缓存，视频缓存channel），防止内存移除
     *
     * @param messageDto
     */
    void removeChannelByMq(NettyMessageDto messageDto);

}
